package com.sheng.leetcode.year2022.month10.day19;

import org.junit.Test;

import java.util.HashMap;
import java.util.Map;

/**
 * @author liusheng
 * @date 2022/10/19
 *<p>
 * 1700. 无法吃午餐的学生数量<p>
 *<p>
 * 学校的自助午餐提供圆形和方形的三明治，分别用数字 0 和 1 表示。所有学生站在一个队列里，每个学生要么喜欢圆形的要么喜欢方形的。<p>
 * 餐厅里三明治的数量与学生的数量相同。所有三明治都放在一个 栈 里，每一轮：<p>
 * 如果队列最前面的学生 喜欢 栈顶的三明治，那么会 拿走它 并离开队列。<p>
 * 否则，这名学生会 放弃这个三明治 并回到队列的尾部。<p>
 * 这个过程会一直持续到队列里所有学生都不喜欢栈顶的三明治为止。<p>
 * 给你两个整数数组 students 和 sandwiches ，其中 sandwiches[i] 是栈里面第 i 个三明治的类型（i = 0 是栈的顶部），<p>
 * students[j] 是初始队列里第 j 名学生对三明治的喜好（j = 0 是队列的最开始位置）。请你返回无法吃午餐的学生数量。<p>
 *<p>
 * 示例 1：<p>
 * 输入：students = [1,1,0,0], sandwiches = [0,1,0,1]<p>
 * 输出：0<p>
 * 解释：<p>
 * - 最前面的学生放弃最顶上的三明治，并回到队列的末尾，学生队列变为 students = [1,0,0,1]。<p>
 * - 最前面的学生放弃最顶上的三明治，并回到队列的末尾，学生队列变为 students = [0,0,1,1]。<p>
 * - 最前面的学生拿走最顶上的三明治，剩余学生队列为 students = [0,1,1]，三明治栈为 sandwiches = [1,0,1]。<p>
 * - 最前面的学生放弃最顶上的三明治，并回到队列的末尾，学生队列变为 students = [1,1,0]。<p>
 * - 最前面的学生拿走最顶上的三明治，剩余学生队列为 students = [1,0]，三明治栈为 sandwiches = [0,1]。<p>
 * - 最前面的学生放弃最顶上的三明治，并回到队列的末尾，学生队列变为 students = [0,1]。<p>
 * - 最前面的学生拿走最顶上的三明治，剩余学生队列为 students = [1]，三明治栈为 sandwiches = [1]。<p>
 * - 最前面的学生拿走最顶上的三明治，剩余学生队列为 students = []，三明治栈为 sandwiches = []。<p>
 * 所以所有学生都有三明治吃。<p>
 *<p>
 * 示例 2：<p>
 * 输入：students = [1,1,1,0,0,1], sandwiches = [1,0,0,0,1,1]<p>
 * 输出：3<p>
 *<p>
 * 提示：<p>
 * 1 <= students.length, sandwiches.length <= 100<p>
 * students.length == sandwiches.length<p>
 * sandwiches[i] 要么是 0 ，要么是 1 。<p>
 * students[i] 要么是 0 ，要么是 1 。<p>
 */
public class LeetCode1700 {

    @Test
    public void test01() {
//        int[] students = {1,1,0,0}, sandwiches = {0,1,0,1};
        int[] students = {1,1,1,0,0,1}, sandwiches = {1,0,0,0,1,1};
        System.out.println(new Solution().countStudents(students, sandwiches));
    }
}
class Solution {
    int[] nums = {0, 1};
    public int countStudents(int[] students, int[] sandwiches) {
        int length = students.length;
        // 保存 students 中的 0 和 1 的数量
        Map<Integer, Integer> map = new HashMap<>(8);
        for (int student : students) {
            if (student == nums[0]) {
                map.put(nums[0], map.getOrDefault(nums[0], 0) + 1);
            } else {
                map.put(nums[1], map.getOrDefault(nums[1], 0) + 1);
            }
        }
        for (int i = 0; i < length; i++) {
            if (sandwiches[i] == nums[0] && map.containsKey(nums[0]) && map.get(nums[0]) != 0) {
                map.put(nums[0], map.get(nums[0]) - 1);
            } else if (sandwiches[i] == nums[1] && map.containsKey(nums[1]) && map.get(nums[1]) != 0) {
                map.put(nums[1], map.get(nums[1]) - 1);
            } else {
                // 说明两边数组的 0 和 1 的数量不吻合
                return length - i;
            }
        }
        return 0;
    }
}
